var checkList = []; // 用于存储表格的原始数据，以便在前端进行操作
var DuplicateNmae = true;
var elementList = [];
$(function() {
    // 初始化表格
    // 定义表格的唯一ID，方便后续操作
    // 假设您的表格HTML元素ID为 'bootstrap-table' 或者通过 $.table.options.id 获取
    var tableId = 'bootstrap-table'; // 请根据您的实际HTML表格ID进行设置
    $.table.options = $.table.options || {}; // 确保 $.table.options 存在
    $.table.options.id = tableId; // 将表格ID存储在 $.table.options 中

    var data = [];
    var options = {
        id: tableId, // 新增：将表格ID配置到 options 中
        data: data,
        pagination: false,
        showSearch: false,
        showRefresh: false,
        showToggle: false,
        showColumns: false,
        sidePagination: "client",
        columns: [
            {
                checkbox: true
            },
            {
                field: 'index',
                align: 'center',
                title: "序号",
                width: 30,
                formatter: function (value, row, index) {
                    var columnIndex = $.common.sprintf("<input type='hidden' name='index' value='%s'>", $.table.serialNumber(index));
                    var columnId = $.common.sprintf("<input type='hidden' name='adsT[%s].id' value='%s'>", index, row.id);
                    return columnIndex + $.table.serialNumber(index) + columnId;
                }
            },
            {
                field: 'mainName',
                align: 'center',
                title: '二代用户名',
                width: 120,
                formatter: function(value, row, index) {
                    var html = $.common.sprintf("<input data-toggle='tooltip' data-placement='top' title='%s' disabled class='form-control mainName' type='text' name='adsT[%s].mainName' value='%s'>", value,index, value);
                    return html;
                }
            },
            {
                field: 'subName',
                align: 'center',
                title: '广告主用户名',
                width: 120,
                formatter: function(value, row, index) {
                    var html = $.common.sprintf("<input data-toggle='tooltip' data-placement='top' title='%s' disabled class='form-control subName' type='text' name='adsT[%s].subName' value='%s'>", value,index, value);
                    return html;
                }
            },
            {
                field: 'uuid',
                align: 'center',
                title: '广告主uuid',
                formatter: function(value, row, index) {
                    var html = $.common.sprintf("<input data-toggle='tooltip' data-placement='top' title='%s' disabled  class='form-control uuid' type='text' name='adsT[%s].uuid' value='%s'>", value, index, value);
                    return html;
                }
            },
            {
                field: 'category',
                align: 'center',
                title: '资质名称',
                formatter: function(value, row, index) {
                    var html = $.common.sprintf("<input data-toggle='tooltip' data-placement='top' title='%s' disabled class='form-control category' type='text' name='adsT[%s].category' value='%s'>", value, index, value);
                    return html;
                }
            },
            {
                field: 'advertiseQualificationId',
                align: 'center',
                title: '资质ID',
                formatter: function(value, row, index) {
                    var html = $.common.sprintf("<input data-toggle='tooltip' data-placement='top' title='%s' disabled class='form-control advertiseQualificationId' type='text' name='adsT[%s].advertiseQualificationId' value='%s'>", value, index, value);
                    return html;
                }
            },
            {
                field: 'planName',
                align: 'center',
                title: '广告计划名称',
                formatter: function(value, row, index) {
                    var html = $.common.sprintf("<input data-toggle='tooltip' data-placement='top' title='%s' disabled   class='form-control planName' type='text' name='adsT[%s].planName' value='%s'>", value, index, value);
                    return html;
                }
            },
            {
                field: 'groupName',
                align: 'center',
                title: '广告组名称',
                formatter: function(value, row, index) {
                    var html = $.common.sprintf("<input data-toggle='tooltip' data-placement='top' title='%s' disabled  class='form-control groupName' type='text' name='adsT[%s].groupName' value='%s'>", value, index, value);
                    return html;
                }
            },
            {
                field: 'adsName',
                align: 'center',
                title: '广告名称',
                formatter: function(value, row, index) {
                    var html = $.common.sprintf("<input data-toggle='tooltip' data-placement='top' title='%s' disabled  class='form-control adsName' type='text' name='adsT[%s].adsName' value='%s'>", value, index, value);
                    return html;
                }
            },
            {
                field: 'msg',
                align: 'center',
                title: '执行情况',
                width: 88,
                formatter: function(value, row, index) {
                    return `<a class="ui label teal" id=${row.suuid+"Msg"}>等待开始</a>`;
                }
            },
            {
                field: 'msgNote',
                align: 'center',
                title: '执行详细',
                width: 200,
                formatter: function(value, row, index) {
                    return `<div id=${row.suuid+"MsgNote"}></div>`;
                }
            },
        ]
    };
    $.table.init(options); // 初始化表格
    $('#DuplicateBox').on('change', function() {
        DuplicateNmae = $(this).prop('checked');
    });
    $('.menu .item').tab(); // 初始化菜单选项卡
    $('.checkbox').checkbox(); // 初始化UI单选复选框
    // 计划限额 单选 关联限额金额框显隐
    $('input[name="dailyBudgetR1"]').on('change', function() {
        var selectedValue = $('input[name="dailyBudgetR1"]:checked').val();
        $('.dailyBudget1').transition('scale'); // 添加过渡效果
        if(selectedValue == 0){ // 如果选择不限额
            $('#dailyBudget1').val(-1);
            $('#dailyBudget1').prop('disabled', true); // 禁用输入框
        } else {
            $('#dailyBudget1').val('');
            $('#dailyBudget1').prop('disabled', false); // 启用输入框
        }
    });
    $('input[name="dailyBudgetR2"]').on('change', function() {
        var selectedValue = $('input[name="dailyBudgetR2"]:checked').val();
        $('.dailyBudget2').transition('scale'); // 添加过渡效果
        if(selectedValue == 0){ // 如果选择不限额
            $('#dailyBudget2').val(-1);
            $('#dailyBudget2').prop('disabled', true); // 禁用输入框
        } else {
            $('#dailyBudget2').val('');
            $('#dailyBudget2').prop('disabled', false); // 启用输入框
        }
    });

    // 投放日期 单选 关联截至日期框显隐
    $('input[name="dateType"]').on('change', function() {
        var selectedValue = $('input[name="dateType"]:checked').val();
        $('.dateD') .transition('scale') ;
        if(selectedValue==0){
            $('#relEndDate') .val('2038-01-19');
        }else{
            $('#relEndDate') .val($('#endDate').val());
        }
    });

    //投放日期 日期控件
    layui.use('laydate', function() {
        var laydate = layui.laydate;
        var formattedToday = new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(2, '0') + '-' + new Date().getDate().toString().padStart(2, '0');

        laydate.render({
            elem: '#startDate',
            value: formattedToday,
            min: formattedToday,
            done:  startDateChange
        });
        laydate.render({
            elem: '#endDate',
            value: formattedToday,
            min: formattedToday,
            done: endDateChange
        });

        laydate.render({ elem: '#relStartDate', value: formattedToday });
        laydate.render({ elem: '#relEndDate', value: '2038-01-19' });
        initializeTimePickers(laydate, formattedToday);
    });

    //投放时段 控制显隐
    $('#group input[name="scheduleTimeRadio"]').change(
        function (){
            $('#scheduleTimeD') .transition('fade up') ;
            var scheduleTimeRadio = $('input[name="scheduleTimeRadio"]:checked').val();
            clearSelection();
            $('#scheduleTime').val(scheduleTimeRadio === "1" ? "1".repeat(336) : "0".repeat(336));
        }
    );

    //获取账号定向信息
    $.ajax({
        url: '/system/audienceinfo/selectList', // 替换为实际的API路径
        type: 'GET',
        dataType: 'json',
        success: function(response) {
            if (response && response.length > 0) {
                audienceinfo = response;
                resetOpt();
            } else {
                console.log("没有创建过定向包")
            }
        },
        error: function(xhr, status, error) {
            console.error('请求失败:', status, error);
            alert('加载数据失败，请稍后重试');
        }
    });


    //根据非商店、联盟 变更展现形式状态
    $('input[name="mediaType"]').on('change', function() {
        if (this.checked) {
            $('input[name="placeType"]').prop('checked', false);
            if ( this.value==='1'){// 非商店
                $('input[name="placeType"][value="1"]').prop('disabled', false);
                $('input[name="placeType"][value="2"]').prop('disabled', true);
                $('input[name="placeType"][value="3"]').prop('disabled', true);
                $('input[name="placeType"][value="4"]').prop('disabled', true);
                $('input[name="placeType"][value="5"]').prop('disabled', true);
                $('input[name="placeType"][value="9"]').prop('disabled', true);
            }
            if ( this.value==='2'){// 联盟
                $('input[name="placeType"][value="1"]').prop('disabled', true);
                $('input[name="placeType"][value="2"]').prop('disabled', false);
                $('input[name="placeType"][value="3"]').prop('disabled', false);
                $('input[name="placeType"][value="4"]').prop('disabled', false);
                $('input[name="placeType"][value="5"]').prop('disabled', false);
                $('input[name="placeType"][value="9"]').prop('disabled', false);
            }
            $('#displayModeD, #normD').empty();
        }
    });
    //获取类型、规格物料
    $('input[name="placeType"]').change(function() {
        getcreativeType();
        $('#normD').empty();
    });
});


// 获取展现形式 物料
function getcreativeType(){
    if (checkList.length===0){
        $.modal.msgError("请先导入广告主、广告信息！！！");
        $('input[name="placeType"]').prop('checked', false);
        return;
    }
    var e = {};
    e.displayType = $('input[name="placeType"]:checked').val();
    e.adType =  $('#plan input[name="adType"]:checked').val();
    e.mediaType =$('#plan input[name="mediaType"]:checked').val();
    e.positionType = 1 ;
    e.genType = 2 ;
    var body = {};
    body.jsonStr = JSON.stringify(e);
    body.uuid = checkList[0].uuid;
    body.token = checkList[0].mainName;

    $.ajax({
        url: "/vivo/api/creativeType",
        type: "POST",
        contentType: "application/json",
        data: JSON.stringify(body),
        success: function(response) {
            var data = JSON.parse(response);
            if(data.code===0){
                gentdisplayModeRadio(data.data)
            }else{
                $.modal.msgWarning('请求投放位置失败，请联系系统管理员')
            }
        },
        error: function(xhr, status, error) {
            $.modal.msgWarning('服务器内部错误，请联系系统管理员');
        }
    });
}
function gentdisplayModeRadio(e) {
    creativeTypeList = e;
    // 获取显示容器
    var container = $('#displayModeD');
    // 清空已有内容
    container.empty();
    // 遍历 data，生成单选按钮
    creativeTypeList.forEach(function(item) {
        if (item.displayName==="组图")return;
        // 为每个 displayName 创建一个单选按钮
        var radioButtonHtml = `
                <div class="field">
                    <div class="ui radio checkbox">
                        <input type="radio" data-flag="pass" name="displayMode" value="${item.displayMode}" label="${item.displayName}" tabindex="0" class="hidden">
                        <label>${item.displayName}</label>
                    </div>
                </div>
            `;
        // 将生成的 HTML 插入到容器中
        container.append(radioButtonHtml);
    });
    // 初始化 Semantic UI 的单选按钮样式
    $('.ui.radio.checkbox').checkbox();
    // 添加事件监听，监听选中值的变化
    $('input[name="displayMode"]').on('change', function() {
        //渲染 类型 下的规格 并且默认选中首个
        setNorm($(this).val());
    });
}
function setNorm(e){
    const result = creativeTypeList.find(item => Number(item.displayMode)  === Number(e));
    gentnormModeRadio(result.dtoList);
}
function gentnormModeRadio(e) {
    // 获取显示容器
    var container = $('#normD');
    // 清空已有内容
    container.empty();
    // 遍历 data，生成单选按钮
    e.forEach(function(item) {
        // 为每个 displayName 创建一个单选按钮
        var radioButtonHtml = `
                <div class="field">
                    <div class="ui radio checkbox">
                        <input type="radio" name="materialNormId" value="${item.id}" label="${item.dimensions}"  tabindex="0" class="hidden" data-flag="pass">
                        <label>${item.dimensions}</label>
                    </div>
                </div>
            `;
        // 将生成的 HTML 插入到容器中
        container.append(radioButtonHtml);
    });
    // 初始化 Semantic UI 的单选按钮样式
    $('.ui.radio.checkbox').checkbox();
    // 添加事件监听，监听选中值的变化
    $('input[name="materialNormId"]').on('change', function() {
        getormElementList($(this).val());
    });
}
// 获取 创意规格
function getormElementList(normId){
    var e = {};
    e.normId = normId;
    e.adTypeEnum =$('#plan input[name="adType"]:checked').val();
    e.mediaType = $('#plan input[name="mediaType"]:checked').val();
    var body = {};
    body.jsonStr = JSON.stringify(e);
    body.uuid = checkList[0].uuid;
    body.token = checkList[0].mainName;

    $.ajax({
        url: "/vivo/api/normElementList",
        type: "POST",
        contentType: "application/json",
        data: JSON.stringify(body),
        success: function(response) {
            if(JSON.parse(response).code===0){
                //规格物料
                elementList=JSON.parse(response).data;
            }else{
                $.modal.msgWarning('请求创意规格失败，请联系系统管理员')
            }
        },
        error: function(xhr, status, error) {
            $.modal.msgWarning('服务器内部错误，请联系系统管理员');
        }
    });
}


// 导入数据
function importData() {
    // 创建一个隐藏的文件输入框，用于触发文件选择
    const fileInput = $('#importDataI');

    // 绑定文件选择事件，确保每次点击只绑定一次，避免重复触发
    fileInput.off('change').on('change', function() {
        const file = this.files[0];
        if (file) {
            const formData = new FormData();
            formData.append("file", file);

            // 发起 AJAX 请求上传文件
            $.ajax({
                url: '/vivo/api/importData',
                type: 'POST',
                data: formData,
                contentType: false, // 必须设置为 false，jQuery 不会去处理发送的数据
                processData: false, // 必须设置为 false，jQuery 不会对数据进行编码
                beforeSend: function (){
                    // 显示加载动画或遮罩
                    $('.adTable').addClass('active');
                    // 在发送请求前，清空表格数据，确保用户体验
                    $("#" + $.table.options.id).bootstrapTable('removeAll');
                },
                success: function(response) {
                    if (response.code === 0){
                        $.modal.msgSuccess("导入成功");
                        if (response.data.length===0){
                            return;
                        }
                        // 优化：使用 Bootstrap-Table 的 load 方法批量更新表格数据
                        // load 方法会清除旧数据并加载新数据，比逐行添加高效得多
                        $("#" + $.table.options.id).bootstrapTable('load', response.data);
                        checkList = response.data; // 更新 checkList 以同步数据
                        getCvType();
                    } else {
                        $.modal.alertError('导入失败 ' + (response.msg || '未知错误'));
                    }
                },
                error: function(xhr, status, error) {
                    console.error("上传失败：", error);
                    $.modal.msgError("上传失败：" + (error || '未知错误'));
                },
                complete: function (){
                    // 隐藏加载动画或遮罩
                    $('.adTable').removeClass('active');
                    // 清空文件上传框的值，以便可以再次选择相同文件触发 change 事件
                    fileInput.val('');
                    // 更新创意数量
                    $('#adsNum').text(checkList.length);
                }
            });
        }
    });
    // 触发文件选择窗口
    fileInput.click();
}

// 删除选中行
function deleteLine(){
    var idsToDelete = $.table.selectColumns("suuid"); // 获取选中的行的 suuid 数组
    if (idsToDelete.length === 0) {
        $.modal.alertWarning("请至少选择一条记录");
        return;
    }

    // 优化：先更新 checkList 数组，再从表格中移除行
    // 这样可以保持 checkList 和表格数据的同步，且过滤操作不会直接影响DOM性能
    checkList = checkList.filter(item => !idsToDelete.includes(item.suuid));

    $("#" + $.table.options.id).bootstrapTable('remove', {
        field: 'suuid',
        values: idsToDelete
    });

    // 更新创意数量
    $('#adsNum').text(checkList.length);
}


function startDateChange(e) {
    $('#relStartDate').val(e);
}
function endDateChange(e) {
    $('#relEndDate').val(e);
}

function initializeTimePickers(laydate, formattedToday) {
    var startDate = laydate.render({
        elem: '#laydate-startTime',
        max: $('#laydate-endTime').val(),
        min: formattedToday,
        theme: 'molv',
        trigger: 'click',
        done: function(value, date) {
            updateMinDate(endDate, date, value);
        }
    });

    var endDate = laydate.render({
        elem: '#laydate-endTime',
        min: $('#laydate-startTime').val(),
        theme: 'molv',
        trigger: 'click',
        done: function(value, date) {
            updateMaxDate(startDate, date, value);
        }
    });
}

function updateMinDate(endDate, date, value) {
    endDate.config.min = value ? { year: date.year, month: date.month - 1, date: date.date } : {};
}

function updateMaxDate(startDate, date, value) {
    startDate.config.max = value ? { year: date.year, month: date.month - 1, date: date.date } : {};
}

function resetMsg(suuid,msgStyle,msg){
    $(`#${suuid}Msg`).removeClass().addClass(`ui label ${msgStyle}`);
    $(`#${suuid}Msg`).text(`${msg}`);
}

function resetMsgNote(suuid,note){
    $(`#${suuid}MsgNote`)
        .append(`<div class="msg-line">${note}</div>`)// 添加新的消息并换行
        .addClass('msg-container');
    // 自动滚动到底部，确保最新的消息显示
    const msgContainer = $(`#${suuid}MsgNote`);
    msgContainer.scrollTop(msgContainer[0].scrollHeight);

}

function resetDuplicateBox(){
    const box = $('#DuplicateBox');
    box.prop('checked', !box.prop('checked'));
    box.trigger('change');
}

//获取ocpo下拉
function getCvType() {
    $('.ocpxPrice').wrap('<div class="ui loading form"></div>');
    const jsonStr = JSON.stringify({
        adType: $('#plan input[name="adType"]:checked').val(),
        mediaType: $('#plan input[name="mediaType"]:checked').val(),
        campaignType: $('#plan input[name="campaignType"]:checked').val()
    });
    $.ajax({
        url: '/vivo/api/getCvType',
        type: 'POST',
        contentType: 'application/json',
        data: JSON.stringify({
            uuid:checkList[0].uuid,
            token:checkList[0].mainName,
            jsonStr:jsonStr
        }),
        success: function(response) {
            handleCvTypeResponse(JSON.parse(response));
        },
        error: function(xhr, status, error) {
            console.error('Error:', error);
            $.modal.msgWarning(error);
        }
    });
}


function handleCvTypeResponse(response) {
    if (response.code == 0) {
        setOcpxPriceOpt(response.data);
    } else {
        $.modal.msgWarning(response.msg);
    }
    unwrapLoadingForm('ocpxPrice');
}

function unwrapLoadingForm(className) {
    // 找到所有指定 class 的元素
    const elements = $(`.${className}`);

    // 遍历每个元素
    elements.each(function() {
        // 找到该元素外层的 .ui.loading.form div
        const loadingFormDiv = $(this).closest('.ui.loading.form');

        // 如果找到了 .ui.loading.form div
        if (loadingFormDiv.length) {
            // 使用 replaceWith 将 .ui.loading.form 替换为其子元素
            loadingFormDiv.replaceWith(loadingFormDiv.contents());
        }
    });
}

function setOcpxPriceOpt(data) {
    const $select = $('#ocpxPriceS').empty();
    const $priceRangeTip = $('#priceRangeTip');

    $.each(data.ocpxCvTypeVoList, function(index, item) {
        const $option = $('<option></option>')
            .val(item.cvTypeDetail.cvType)
            .text(item.cvTypeDetail.cvTypeName)
            .data({
                price: item.cvTypeDetail.cvTypePrice,
                maxPrice: item.cvTypeDetail.cvTypeMaxPrice
            })
            .appendTo($select);
    });

    $select.on('change', function() {
        const $selectedOption = $(this).find('option:selected');
        amountText($selectedOption.data('price'), $selectedOption.data('maxPrice'), $selectedOption.text());
    });

    $select.trigger('change');
}


function amountText(price, maxPrice, text) {
    $('#priceRangeTip').text(`金额区间：${price} - ${maxPrice}/转换`);
    const shouldShow = $.inArray(text, ['自定义激活', '自定义拉活', '表单提交']) !== -1;
    if (shouldShow) {
        if(!$('#biddingStrategy').is(':visible')){
            $('#biddingStrategy').transition('fade in');
        }
    }else{
        if($('#biddingStrategy').is(':visible')){
            $('#biddingStrategy').transition('fade out');
        }
    }
}

var audienceinfo  = [];
//获取定向包
function resetOpt(){
    $('.ui.dropdown').dropdown({
        fullTextSearch: true, // 启用全文搜索
        placeholder: 'Select an option', // 设置占位符
        onChange: function(value, text, $selectedItem) {
            console.log('Selected value:', value);
            console.log('Selected text:', text);
        }
    });
    // 清空现有的下拉框选项
    $('#audienceInfo').empty();
    $('#audienceInfo').append(
        $('<option>', {
            value: "",
            text: "全部不限"
        })
    );
    // 遍历返回的数据，生成下拉框选项
    $.each(audienceinfo, function(index, item) {
        $('#audienceInfo').append(
            $('<option>', {
                value: item.id,
                text: item.name
            })
        );
    });
}

//输入校验
var checkFlag = true;

var groupForm = {}; // 全局变量，用于存储 group 表单数据

// 页面上按钮控制的变量
var DuplicateNmae = true; // 假设页面上有一个按钮控制这个变量，默认为 true

// 修改后的submit函数
async function submit() {
    if (checkList.length === 0) {
        $.modal.msgError("请先导入广告主、广告信息！！！");
        return;
    }

    const planFormData = getFormData("plan"); // 获取计划表单数据
    groupForm = getFormData("group"); // 获取组表单数据

    // 处理 groupForm 的 chargeType 和 spentType
    if (groupForm.chargeType === "3") {
        groupForm.ocpxPrice = groupForm.price;
        delete groupForm.price;
    }
    groupForm.spentType = 1;

    // 处理 groupForm 的 audienceInfo
    var targetItem = audienceinfo.find(item => item.id === Number($('#audienceInfo').val()));
    if (targetItem) {
        groupForm.audienceInfo = JSON.parse(targetItem.audienceInfo);
    }
    if (!groupForm.audienceInfo) {
        groupForm.audienceInfo = {};
    }

    // 遍历 checkList，依次添加计划、组、广告
    for (let i = 0; i < checkList.length; i++) {
        const currentCheckItem = checkList[i]; // 当前处理的 checkList 项

        // 为每个计划创建一个 planFormData 的副本，避免修改原始对象
        const currentPlanFormData = { ...planFormData
        };
        currentPlanFormData.name = currentCheckItem.planName; // 设置计划名称

        try {
            // 等待 addVivoPlan 完成，它会依次调用 addVivoGroup 和 addVivoAD
            await addVivoPlan(currentCheckItem, currentPlanFormData);
        } catch (error) {
            console.error(`Error processing plan ${currentCheckItem.planName}:`, error);
            $.modal.msgError(`处理计划 [${currentCheckItem.planName}] 时发生错误: ${error.message || error}`);
            // 如果希望在发生错误时停止所有后续处理，可以加上 return;
            // return;
        }
    }
    $.modal.msgSuccess("所有任务处理完成！");
}

function getFormData(formId) {
    checkFlag = true;
    let jsonData = {};
    $(`#${formId} :input`).each(function() {
        let name = $(this).attr('name');
        let dataFlag = $(this).data('flag');

        if (name && dataFlag !== "pass") {
            let value = $(this).val();

            if (dataFlag === "money") {
                const numValue = parseFloat(value);
                if (!isNaN(numValue) && numValue > 0) {
                    value = Math.round(numValue * 100000);
                } else if (isNaN(numValue)) {
                    checkFlag = false;
                    $.modal.msgWarning("请输入日限额金额");
                    return false; // 停止each循环
                }
            } else if (dataFlag === "select") {
                // 如果是 select，则转换为逗号分隔的字符串
                value = $(this).val().join(",");
            }

            if ($(this).is(':radio')) {
                if ($(this).is(':checked')) {
                    jsonData[name] = value;
                }
            } else if ($(this).is(':checkbox')) {
                // 获取 checkbox 的选中状态，转换为 0 或 1
                jsonData[name] = $(this).is(':checked') ? 1 : 0;
            } else {
                jsonData[name] = value;
            }
        }
    });
    return jsonData;
}

// 将 addVivoPlan 改为返回 Promise，并在此函数中链式调用后续操作
async function addVivoPlan(checkItem, planJsonData) {
    const suuid = checkItem.suuid;

    return new Promise((resolve, reject) => {
        $.ajax({
            url: '/vivo/api/addPlan',
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify({
                token: checkItem.mainName,
                uuid: checkItem.uuid,
                jsonStr: JSON.stringify(planJsonData)
            }),
            beforeSend: function() {
                resetMsg(suuid, "yellow", "新建计划");
                resetMsgNote(suuid, "计划新增中");
            },
            success: async function(response) {
                let planId = null;
                if (response.code !== 0) {
                    resetMsg(suuid, "red", "服务器错误")
                    resetMsgNote(suuid, "服务器错误：" + response.msg)
                    return;
                }
                if (response.data.code===0){
                    planId = response.data.data.id;
                }else if(response.data.message.includes("计划名称已存在")&&DuplicateNmae){
                    resetMsgNote(suuid, "检测到同名计划，尝试获取ID...");
                    planId = await getPlanIdByName(checkItem);
                }else{
                    resetMsg(suuid,"red","构建失败")
                    resetMsgNote(suuid,  response.data.message)
                    return;
                }
                const groupId = await addVivoGroup(checkItem, planId, planJsonData.adType);
                await addVivoAD(checkItem, groupId);
                resolve(response);
            },
            error: function(xhr, status, error) {
                console.error('请求失败:', error);
                $.modal.alertError('请求失败，请联系系统管理员' + error);
                reject(error); // 拒绝 Promise
            }
        });
    });
}

// 将 addVivoGroup 改为返回 Promise，并在此函数中链式调用后续操作
async function addVivoGroup(checkItem, campaignId, adType) {
    const suuid = checkItem.suuid;

    // 创建 groupForm 的深拷贝，确保每个组的配置独立
    const jsonStr = JSON.parse(JSON.stringify(groupForm));
    jsonStr.name = checkItem.groupName;
    jsonStr.campaignId = campaignId;
    jsonStr.webSiteUrl = checkItem.webSiteUrl;
    jsonStr.builtInRpkDeepLink = checkItem.builtInRpkDeepLink;
    jsonStr.advertiseQualificationId = checkItem.advertiseQualificationId;

    if (checkItem.productId && checkItem.productName) {
        const productSDpa = {};
        productSDpa.productId = checkItem.productId;
        productSDpa.productName = checkItem.productName;
        jsonStr.productSDpa = productSDpa;
    }
    if (checkItem.appletPath && checkItem.appletOriginId) {
        jsonStr.appletOriginId = checkItem.appletOriginId;
        jsonStr.appletPath = checkItem.appletPath;
    }
    if (Number(adType) === 1) {
        jsonStr.h5Type = 2
    }
    if (Number(adType) === 8) {
        jsonStr.rpkDeepLink = checkItem.rpkDeepLink
    }

    if (checkItem.customList) {
        if (!jsonStr.audienceInfo) jsonStr.audienceInfo = {};
        jsonStr.audienceInfo.customList = checkItem.customList.split(',');
    }
    if (checkItem.excludeCustomList) {
        if (!jsonStr.audienceInfo) jsonStr.audienceInfo = {};
        jsonStr.audienceInfo.excludeCustomList = checkItem.excludeCustomList.split(',');
    }

    return new Promise((resolve, reject) => {
        $.ajax({
            url: '/vivo/api/addGroup',
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify({
                token: checkItem.mainName,
                uuid: checkItem.uuid,
                jsonStr: JSON.stringify(jsonStr)
            }),
            beforeSend: function() {
                resetMsg(suuid, "yellow", "新建组");
                resetMsgNote(suuid, "组新增中");
            },
            success: async function(response) {
                let groupId = null;
                if (response.code !== 0) {
                    resetMsg(suuid, "red", "服务器错误")
                    resetMsgNote(suuid, "服务器错误：" + response.msg)
                    return;
                }
                if (response.data.code===0){
                    groupId = response.data.data;
                }else if(response.data.message.includes("组名称已存在")&&DuplicateNmae){
                    resetMsgNote(suuid, "检测到同名组，尝试获取ID...");
                    groupId = await getGroupIdByName(checkItem);
                }else{
                    resetMsg(suuid,"red","构建失败")
                    resetMsgNote(suuid,  response.data.message)
                    return;
                }
                resolve(groupId); // 解决 Promise 并返回 groupId
            },
            error: function(xhr, status, error) {
                console.error('请求失败:', error);
                $.modal.alertError('请求失败，请联系系统管理员' + error);
                reject(error); // 拒绝 Promise
            }
        });
    });
}

// 将 addVivoAD 改为返回 Promise
function addVivoAD(checkItem, groupId) {
    const suuid = checkItem.suuid;
    console.log(groupId);
    // 假设此处没有实际的异步请求，但为了保持链式调用一致性，返回一个 resolved 的 Promise
    return new Promise(resolve => {
        resetMsgNote(suuid, "广告创意创建成功");
        resetMsg(suuid, "green", "任务完成");
        resolve("广告创建成功"); // 解决 Promise
    });
}

// 将 getPlanIdByName 改为返回 Promise
function getPlanIdByName(checkItem) {
    const suuid = checkItem.suuid;
    return new Promise((resolve, reject) => {
        $.ajax({
            url: '/vivo/api/getPlanId',
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify({
                token: checkItem.mainName,
                uuid: checkItem.uuid,
                jsonStr: JSON.stringify({
                    name: checkItem.planName,
                    pageSize: 100
                })
            }),
            success: function(response) {
                if (response.code !== 0) {
                    resetMsg(suuid, "red", "获取计划ID失败");
                    resetMsgNote(suuid, response.msg);
                    return reject(new Error("获取计划ID失败：" + response.msg)); // 拒绝 Promise
                }
                resetMsgNote(suuid, "已选中同名计划");
                resolve(response.data); // 解决 Promise 并返回 planId
            },
            error: function(xhr, status, error) {
                console.error('请求失败:', error);
                $.modal.alertError('请求失败，请联系系统管理员' + error);
                reject(error); // 拒绝 Promise
            }
        });
    });
}

// 将 getGroupIdByName 改为返回 Promise
function getGroupIdByName(checkItem) {
    const suuid = checkItem.suuid;
    return new Promise((resolve, reject) => {
        $.ajax({
            url: '/vivo/api/getGroupId',
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify({
                token: checkItem.mainName,
                uuid: checkItem.uuid,
                jsonStr: JSON.stringify({
                    name: checkItem.groupName,
                    pageSize: 100
                })
            }),
            success: function(response) {
                if (response.code !== 0) {
                    resetMsg(suuid, "red", "获取组ID失败");
                    resetMsgNote(suuid, response.msg);
                    return reject(new Error("获取组ID失败：" + response.msg)); // 拒绝 Promise
                }
                resetMsgNote(suuid, "已选中同名组");
                resolve(response.data); // 解决 Promise 并返回 groupId
            },
            error: function(xhr, status, error) {
                console.error('请求失败:', error);
                $.modal.alertError('请求失败，请联系系统管理员' + error);
                reject(error); // 拒绝 Promise
            }
        });
    });
}

// 上传素材文件到户获取文件code
function getFileCode(token, uuid, file, type) {
    return new Promise((resolve, reject) => {
        // 创建 FormData 对象
        const formData = new FormData();

        // 添加文件
        formData.append('file', file);

        // 添加其他参数作为 JSON
        const jsonBody = {
            token: token,
            uuid: uuid,
            type: type
        };
        formData.append('body', new Blob([JSON.stringify(jsonBody)], { type: 'application/json' }));

        // 发送请求
        $.ajax({
            url: '/vivo/api/setFile',
            type: 'POST',
            data: formData,
            processData: false,  // 重要：告诉 jQuery 不要处理数据
            contentType: false,  // 重要：告诉 jQuery 不要设置 Content-Type
            success: function(response) {
                console.log('上传成功:', response);
                resolve(response); // 解析 Promise
            },
            error: function(xhr, status, error) {
                console.error('请求失败:', error);
                $.modal.alertError('请求失败，请联系系统管理员: ' + error);
                reject(error); // 拒绝 Promise
            }
        });
    });
}


// 生成UUID的函数
function generateUUID() {
    return crypto.randomUUID();
}
// 输入限制函数（直接截断超出的字符）
function limitInput(input, minLength, maxLength) {
    if (input.value.length > maxLength) {
        input.value = input.value.substring(0, maxLength); // 直接截断
    }
}

//验证文件类型和大小
function validateFile(input) {
    const file = input.files[0];
    if (!file) return;

    // 获取配置参数
    const maxSizeKB = parseInt(input.getAttribute('data-max-size'));
    const requiredWidth = parseInt(input.getAttribute('data-width'));
    const requiredHeight = parseInt(input.getAttribute('data-height'));
    const maxSizeBytes = maxSizeKB * 1024;

    // 验证文件类型
    const acceptTypes = input.accept.split(',').map(type => type.trim());
    const fileExtension = '.' + file.name.split('.').pop().toLowerCase();

    if (!acceptTypes.includes(fileExtension)) {
        $.modal.msgWarning(`文件类型不支持！请上传 ${acceptTypes.join(', ').replace(/\./g, '')} 格式的文件`);
        input.value = '';
        return;
    }

    // 验证文件大小（不能超出）
    if (file.size > maxSizeBytes) {
        $.modal.msgWarning(`文件大小不能超过 ${maxSizeKB}KB`);
        input.value = '';
        return;
    }

    // 验证图片分辨率（必须完全相等）
    if (file.type.startsWith('image/')) {
        const img = new Image();
        img.onload = function() {
            URL.revokeObjectURL(img.src); // 释放内存

            if (img.width !== requiredWidth || img.height !== requiredHeight) {
                $.modal.msgWarning(`图片分辨率必须为 ${requiredWidth}×${requiredHeight} 像素，当前为 ${img.width}×${img.height} 像素`);
                input.value = '';
                return;
            }
        };
        img.onerror = function() {
            URL.revokeObjectURL(img.src);
            $.modal.msgWarning('无法读取图片文件，请选择有效的图片文件');
            input.value = '';
        };
        img.src = URL.createObjectURL(file);
        $(`#imgView-${input.getAttribute('data-index')}`).attr('src', URL.createObjectURL(file));
    }
}

function validateMultiFiles(input, componentId) {
    const files = Array.from(input.files);
    if (!files.length) return;

    const maxSizeKB = parseInt(input.getAttribute('data-max-size'));
    const requiredWidth = parseInt(input.getAttribute('data-width'));
    const requiredHeight = parseInt(input.getAttribute('data-height'));
    const maxSizeBytes = maxSizeKB * 1024;
    const acceptTypes = input.accept.split(',').map(type => type.trim());

    // Initialize the object for this component ID if it doesn't exist
    window.uploadedFiles = window.uploadedFiles || {};
    window.uploadedFiles[componentId] = window.uploadedFiles[componentId] || {};

    files.forEach(file => {
        const fileExtension = '.' + file.name.split('.').pop().toLowerCase();

        if (!acceptTypes.includes(fileExtension)) {
            $.modal.msgWarning(`文件类型不支持！请上传 ${acceptTypes.join(', ').replace(/\./g, '')} 格式的文件`);
            return;
        }

        if (file.size > maxSizeBytes) {
            $.modal.msgWarning(`文件大小不能超过 ${maxSizeKB}KB`);
            return;
        }

        if (file.type.startsWith('image/')) {
            const img = new Image();
            img.onload = function() {
                URL.revokeObjectURL(img.src);

                if (img.width !== requiredWidth || img.height !== requiredHeight) {
                    $.modal.msgWarning(`图片分辨率必须为 ${requiredWidth}×${requiredHeight} 像素，当前为 ${img.width}×${img.height} 像素`);
                    return;
                }
                // If all validations pass, add the file with a UUID and create preview
                const fileUuid = generateUUID();
                window.uploadedFiles[componentId][fileUuid] = file;
                createMultiImagePreview(file, componentId, fileUuid);
            };
            img.onerror = function() {
                URL.revokeObjectURL(img.src);
                $.modal.msgWarning('无法读取图片文件，请选择有效的图片文件');
            };
            img.src = URL.createObjectURL(file);
        } else {
            // For non-image files, if they pass type and size, add them directly
            const fileUuid = generateUUID();
            window.uploadedFiles[componentId][fileUuid] = file;
            createMultiImagePreview(file, componentId, fileUuid);
        }
    });

    // Clear the input field to allow selecting the same file(s) again
    input.value = '';
}

function createMultiImagePreview(file, componentId, fileUuid) {
    const reader = new FileReader();
    reader.onload = function(e) {
        const previewHtml = `
            <div class="multi-image-preview-item" id="multi-image-item-${componentId}-${fileUuid}" style="position: relative; width: 100px; height: 100px; border: 1px solid #ddd; display: flex; align-items: center; justify-content: center; overflow: hidden;">
                <img src="${e.target.result}" style="max-width: 100%; max-height: 100%; object-fit: contain;" />
                <button type="button" class="ui mini compact red button"
                        style="position: absolute; top: 0; right: 0; padding: 3px; cursor: pointer;"
                        onclick="removeMultiImage('${componentId}', '${fileUuid}')">
                    X
                </button>
            </div>
        `;
        $(`#multi-image-previews-${componentId}`).append(previewHtml);
    };
    reader.readAsDataURL(file);
}

function removeMultiImage(componentId, fileUuid) {
    if (window.uploadedFiles && window.uploadedFiles[componentId] && window.uploadedFiles[componentId][fileUuid]) {
        delete window.uploadedFiles[componentId][fileUuid]; // Remove the file from the object
        $(`#multi-image-item-${componentId}-${fileUuid}`).remove(); // Remove the preview from DOM
    }
}

function clearAllMultiImages(componentId) {
    if (window.uploadedFiles && window.uploadedFiles[componentId]) {
        window.uploadedFiles[componentId] = {}; // Clear the object
        $(`#multi-image-previews-${componentId}`).empty(); // Remove all previews from DOM
    }
}

// Function to retrieve a file by its component ID and UUID
function getFileByUuid(componentId, fileUuid) {
    if (window.uploadedFiles && window.uploadedFiles[componentId]) {
        const file = window.uploadedFiles[componentId][fileUuid];
        if (file) {
            console.log("获取到的文件:", file);

            const url = URL.createObjectURL(file);
            const a = document.createElement('a');
            a.href = url;
            a.download = file.name;
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);

            // 添加一个延迟，给浏览器足够的时间启动下载
            // 常见的延迟时间是 100ms 到 200ms，或者更长一些，比如 500ms
            setTimeout(() => {
                URL.revokeObjectURL(url); // 释放URL对象
            }, 200); // 200毫秒的延迟

            return file;
        }
    }
    console.log(`未找到 componentId 为 ${componentId}，fileUuid 为 ${fileUuid} 的文件。`);
    return null;
}
